/*
  学习目标：指定更加详细的参数类型
  总结：T代表的是捕获的类型，🔔它可以和任意类型进行组合使用

   :T[] 表示T组成的数组
   :{name: T}表示， name的值类型为T的对象
   :[T, T]  表示的是T组成的元组

*/

type MyList = [number, number];

let list = new Array('123'); // 捕获的是string  -> string[]

type FindFirstFnType = <T>(list: T[]) => T;

// 需求1 接收一个数组，返回值类型是：元素的类型
const getFirst: FindFirstFnType = (list) => {
  return list[0];
};

const result1 = getFirst([1, 2]); // 要求result1的类型是number
const result2 = getFirst(['1', '2']); // 要求result2的类型是string
// const result3 = getFirst([1, '2']); // result3的类型是？？？

type FindNameFnType = <T>(aa: { name: T }) => T;

// 需求2： 传入对象，具有name键，捕获name值的类型作为返回值类型
const findNameFn: FindNameFnType = (obj) => obj.name;
const result3 = findNameFn({ name: '123' }); //返回值类型string
const result4 = findNameFn({ name: 123 }); //返回值类型number
